class Animal {
  constructor(type, food) {
    this.type = type;
    this.food = food;
  }

  eat() {
    console.log(`一只${this.type}正在摄入${this.food}`);
  }
}

/* extends的一刹那 已经将Animal的实例绑定给Person做为原型了 */
class Person extends Animal {
  /* 与具体实例无关的属性和方法——静态成员 */
  static legs = 4;
  static getInfo() {
    // console.log("this in static method", this);
    return `人类是一种四足无毛动物`;
  }

  constructor(name, age) {
    // Must call super constructor in derived class before accessing 'this' or returning from derived constructor
    // Animal.call(this,"人类", "大米白面")
    super("人类", "大米白面");
    this.name = name;
    this.age = age;
  }

  /* 扩展父类方法（通过重写/覆盖/override） */
  eat() {
    // 调用父类方法
    super.eat(); //Animal.prototype.eat.call(this)
    console.log(`一只${this.type}${this.name}正在享用${this.food}`);
  }

  /* 人类会思考 */
  // Person.prototype.think = function(){}
  think() {
    console.log(`${this.name}正在思考`);
  }
}

class Student extends Person {
  // 如果想扩展属性 就要重新写构造器
  constructor(name, age, major) {
    // 只要重新写构造器 就一定要先调用父类构造器
    // Person.call(this,name,age)
    super(name, age);
    this.major = major;
  }

  study() {
    console.log(`${this.name}正在学习${this.major}`);
  }

  /* 重写父类think方法 */
  think() {
    super.think();
    console.log(`学生【${this.name}】正在潜心钻研${this.major}`);
  }

  toString() {
    return `[姓名:${this.name},专业:${this.major}]`;
  }
}
